#include "EventLoop.h"
#include <iostream>
#include <unistd.h>
#include <sys/syscall.h> 
EventLoop::EventLoop()
    : ep_(new Epoll)
{
    // printf("pppppppppppppp");
    // ep_ = new Epoll;
}
EventLoop::~EventLoop()
{
    delete ep_;
}

Epoll *EventLoop::ep()
{
    return ep_;
}

void EventLoop::run()
{
    //printf("EventLoop thread is: %d\n", syscall(SYS_gettid));
    while (1)
    {
        std::vector<Channel *> channels;
        channels = ep_->loop();//6秒
        // 如果channels为空，表示超时，回调TcpServer::epolltimeout()
        if (channels.size() == 0)
        {
            epolltimeoutcallback_(this);
        }
        else
        {
            for (auto ch : channels)
            {
                ch->handleevent();
            }
        }
    }
}

// void EventLoop::updatechannel(Channel *ch)
// {
//     struct epoll_event ev;
//     ev.data.ptr = ch;
//     ev.events = ch->events();

//     if(ch->inpoll()){//已经在树上就更新
//         if(epoll_ctl(ep()->epollfd(),EPOLL_CTL_MOD,ch->fd(),&ev)==-1){
//             perror("epoll_ctl error");
//             exit(-1);
//         }
//     }else{// 添加
//         if(epoll_ctl(epollfd_,EPOLL_CTL_ADD,ch->fd(),&ev)==-1){
//             perror("epoll_ctl error");
//             exit(-1);
//         }
//         ch->setinepoll();
//     }
// }

void EventLoop::setepolltimeoutcallback(std::function<void(EventLoop *)> f)
{
    epolltimeoutcallback_ = f;
}


void EventLoop::updatechannel(Channel *ch)
{
    // struct epoll_event ev;
    // ev.data.ptr = ch;
    // ev.events = ch->events();

    // if(ch->inpoll()){//已经在树上就更新
    //     if(epoll_ctl(ep_->epollfd(),EPOLL_CTL_MOD,ch->fd(),&ev)==-1){
    //         perror("epoll_ctl error");
    //         exit(-1);
    //     }
    // }else{// 添加
    //     if(epoll_ctl(ep_->epollfd(),EPOLL_CTL_ADD,ch->fd(),&ev)==-1){
    //         perror("epoll_ctl error");
    //         exit(-1); 
    //     }
    //     ch->setinepoll();
    // }
    ep_->updatechannel(ch);
}

void EventLoop::removechannel(Channel *ch)
{
    ep_->removechannel(ch);
}